• 预备
  • 基础语法
  • 容器类型
  • 函数
  • 面向对象
  • 输入输出
  • 进程控制
  • 线程控制
  • 正则表达式
  • 网络编程
  • 图形界面
  • 常见问题
  • API 帮助手册

  • 设置

6711

34 分钟

#Qt Theme 纯 qss 的 Qt 主题

源码地址:https://github.com/hubenchang0515/QtTheme/

Qt Theme 界面预览

Qt Theme 是一个纯 qss 的 Qt 主题项目,能够极为简单对已有项目的风格进行改进。

支持 C++、PyQt5、PyQt6、PySide2、PySide6,并以 WebAssembly 的方式在 GitHub Pages 上发布。

#安装

这里演示一下在 Python 上的使用,首先进行安装:

pip install QtTheme

#演示

#原生样式及代码

让 Deep Seek 随便帮我写个界面作为示例:

deepseek 示例代码

import sys from PySide6.QtWidgets import * from PySide6.QtGui import QPixmap from PySide6.QtCore import Qt, QTimer class DemoWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt Widget 演示界面") self.setGeometry(100, 100, 800, 600) # 创建中心widget和主布局 central_widget = QWidget() self.setCentralWidget(central_widget) main_layout = QVBoxLayout(central_widget) # 添加功能区域 self.create_input_section(main_layout) self.create_selection_section(main_layout) self.create_display_section(main_layout) self.create_progress_section(main_layout) # 添加状态栏 self.statusBar().showMessage("就绪") # 初始化进度条 self.progress_value = 0 self.update_progress() def create_input_section(self, layout): group = QGroupBox("输入控件") grid = QGridLayout() # 文本输入 self.line_edit = QLineEdit() self.line_edit.setPlaceholderText("单行文本输入...") grid.addWidget(QLabel("单行文本:"), 0, 0) grid.addWidget(self.line_edit, 0, 1) # 多行文本 self.text_edit = QTextEdit() self.text_edit.setPlaceholderText("多行文本输入...") grid.addWidget(QLabel("多行文本:"), 1, 0) grid.addWidget(self.text_edit, 1, 1) # 数字输入 self.spin_box = QSpinBox() self.spin_box.setRange(0, 100) grid.addWidget(QLabel("数字输入:"), 2, 0) grid.addWidget(self.spin_box, 2, 1) group.setLayout(grid) layout.addWidget(group) def create_selection_section(self, layout): group = QGroupBox("选择控件") hbox = QHBoxLayout() # 复选框 vbox = QVBoxLayout() self.check1 = QCheckBox("选项1") self.check2 = QCheckBox("选项2") vbox.addWidget(self.check1) vbox.addWidget(self.check2) hbox.addLayout(vbox) # 单选框 vbox = QVBoxLayout() self.radio1 = QRadioButton("单选1") self.radio2 = QRadioButton("单选2") self.radio1.setChecked(True) vbox.addWidget(self.radio1) vbox.addWidget(self.radio2) hbox.addLayout(vbox) # 下拉列表 self.combo = QComboBox() self.combo.addItems(["选项A", "选项B", "选项C"]) hbox.addWidget(self.combo) group.setLayout(hbox) layout.addWidget(group) def create_display_section(self, layout): group = QGroupBox("显示控件") hbox = QHBoxLayout() # 标签 self.label = QLabel("这是一个标签") self.label.setAlignment(Qt.AlignCenter) self.label.setStyleSheet("border: 1px solid gray; padding: 10px;") hbox.addWidget(self.label) # 图片显示 pixmap = QPixmap(100, 50) pixmap.fill(Qt.blue) image_label = QLabel() image_label.setPixmap(pixmap) hbox.addWidget(image_label) # 列表控件 self.list_widget = QListWidget() self.list_widget.addItems(["项目1", "项目2", "项目3"]) hbox.addWidget(self.list_widget) group.setLayout(hbox) layout.addWidget(group) def create_progress_section(self, layout): group = QGroupBox("进度控件") vbox = QVBoxLayout() # 进度条 self.progress_bar = QProgressBar() self.progress_bar.setValue(0) vbox.addWidget(self.progress_bar) # 滑块 self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, 100) self.slider.valueChanged.connect(self.on_slider_changed) vbox.addWidget(self.slider) # 控制按钮 btn_layout = QHBoxLayout() self.start_btn = QPushButton("开始进度") self.start_btn.clicked.connect(self.start_progress) self.reset_btn = QPushButton("重置") self.reset_btn.clicked.connect(self.reset_progress) btn_layout.addWidget(self.start_btn) btn_layout.addWidget(self.reset_btn) vbox.addLayout(btn_layout) group.setLayout(vbox) layout.addWidget(group) def on_slider_changed(self, value): self.progress_bar.setValue(value) self.statusBar().showMessage(f"滑块值: {value}") def start_progress(self): self.timer = QTimer() self.timer.timeout.connect(self.update_progress) self.timer.start(100) def update_progress(self): self.progress_value += 1 if self.progress_value > 100: self.timer.stop() return self.progress_bar.setValue(self.progress_value) self.slider.setValue(self.progress_value) def reset_progress(self): self.progress_value = 0 self.progress_bar.setValue(0) self.slider.setValue(0) if __name__ == "__main__": app = QApplication(sys.argv) window = DemoWindow() window.show() sys.exit(app.exec())

运行起来看看:

原生界面样式

#设置全局样式

导入 QtTheme 并设置样式:

import QtTheme.PySide6 as QtTheme class DemoWindow(QMainWindow): def __init__(self): # 省略... # 设置全局样式 self.setStyleSheet(QtTheme.getThemeStyle('Flat', 'Dark', 'Blue', 'Pink'))

全局暗色样式

#设置颜色

最后根据需要,通过 QWidget.setProperty 对 widgets 设置颜色:

def create_progress_section(self, layout): # 省略 ... # 给按钮设置颜色 self.start_btn.setProperty("Color", "Primary") self.reset_btn.setProperty("Color", "Danger")

设置颜色后

#导出资源

你也可以不安装 QtTheme,而是通过 在线页面 导出资源文件, 通过 RCC 将其加入你的项目:

pyside6-rcc -o resource.py QtTheme.qrc

只需要修改导入方式,其余代码一致:

from PySide6.QtCore import QFile import resource # 导入生成的 resource.py class DemoWindow(QMainWindow): def __init__(self): # 省略... qss = QFile(":/QtTheme/theme/Flat/Dark/Blue/Pink.qss") qss.open(QFile.OpenModeFlag.ReadOnly) self.setStyleSheet(qss.readAll().data().decode())

创建于 2025/5/13 19:59:57

更新于 2025/5/13 19:59:57